/*
练习3-4 符号配对
分数 20
作者 DS课程组
单位 浙江大学

请编写程序检查C语言源程序中下列符号是否配对：(与)、[与]、{与}。
输入格式:

输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候，标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:

首先，如果所有符号配对正确，则在第一行中输出YES，否则输出NO。然后在第二行中指出第一个不配对的符号：如果缺少左符号，则输出?-右符号；如果缺少右符号，则输出左符号-?。

输出样例2：

NO
?-]

输入样例3：

void test()
{
    int i
    double A[10];
    for (i=0; i<10; i++) 
        A[i] = 0.1*i;
}
.

输出样例3：

YES
*/

#include <iostream>
#include <stack>

using namespace std;

struct Token {
    string text;
    int pos;
    string token;

    bool isLeft() const {
        return token == "/*" || token == "(" || token == "[" || token == "{";
    }
    bool isRight() const {
        return token == "*/" || token == ")" || token == "]" || token == "}";
    }
    bool haveNext() {
        for (; pos < text.size(); pos++) {
            if (text[pos] == '(' || text[pos] == ')' || text[pos] == '[' || text[pos] == ']' || text[pos] == '{' || text[pos] == '}') {
                token = text.substr(pos, 1);
                pos++;
                return true;
            }
            if (text[pos] == '/' && pos + 1 < text.size() && text[pos + 1] == '*') {
                token = "/*";
                pos += 2;
                return true;
            }
            if (text[pos] == '*' && pos + 1 < text.size() && text[pos + 1] == '/') {
                token = "*/";
                pos += 2;
                return true;
            }
        }
        return false;
    }
};

bool match(string left, string right) {
    return (left == "/*" && right == "*/") 
    || (left == "(" && right == ")") 
    || (left == "[" && right == "]") 
    || (left == "{" && right == "}");
}

bool check(Token &token, string &result) {
    stack<string> s;
    while (token.haveNext()) {
        if (token.isLeft()) {
            s.push(token.token);
        } else if (token.isRight()) {
            if (s.empty()) {
                result = "?-" + token.token;
                // cout << "?-" << token.token << endl;
                return false;
            }
            string left = s.top();
            s.pop();
            if (!match(left, token.token)) {
                result = left + "-?";
                // cout << "?-" << token.token << endl;
                return false;
            }
        }
    }
    if (!s.empty()) {
        result = s.top() + "-?";
        // cout << s.top() << "-?" << endl;
        return false;
    }
    return true;
}

int main() {
    string s;
    string all = "";
    while (getline(cin, s) && s != ".") {
        all += s;
    }
    Token token{all, 0, ""};
    string result;
    if (check(token, result)) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
        cout << result << endl;
    }
    return 0;
}